package com.cndym.utils;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/*字符串 DESede(3DES) 加密*/

public class DESede {
	
	public static void main(String[] args){
		String info = "partner_id=8001&partner_username=username";
		String key = "zch168_120530_leshua_PAY"; 
		
		byte[] token = encryptMode(key.getBytes(),info.getBytes());
		
		byte[] src = decryptMode(key.getBytes(), token);
		
		System.out.println(new String(src));
	}

	/*
	 * @param args在java中调用sun公司提供的3DES加密解密算法时，需要使
	 * 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包：
	 * jce.jar
	 * security/US_export_policy.jar
	 * security/local_policy.jar
	 * ext/sunjce_provider.jar
	 */
	
	//定义加密算法,可用 DES,DESede,Blowfish
	private static final String Algorithm = "DESede"; 
	

	/* 加密函数
	 * 
	 * keybyte为加密密钥，长度为24字节
	 * 
	 * src为被加密的数据缓冲区（源）
	 * 
	 * exp：
	 * String szSrc = "This is a 3DES test. 测试";
	 * System.out.println("加密前的字符串:" + szSrc);
	 * byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());
	 * System.out.println("加密后的字符串:" + new String(encoded));
	 * 
	 */
	public static byte[] encryptMode(byte[] keybyte,byte[] src){
		
		try {
		
			//生成密钥
			SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
		
			//加密
			Cipher c1 = Cipher.getInstance(Algorithm);
			
			c1.init(Cipher.ENCRYPT_MODE, deskey);
			
			//在单一方面的加密或解密
			return c1.doFinal(src);
		
		} catch (java.security.NoSuchAlgorithmException e1) {
		
			e1.printStackTrace();
			
			}catch(javax.crypto.NoSuchPaddingException e2){
			
				e2.printStackTrace();
			
			}catch(Exception e3){

				e3.printStackTrace();
			}

		return null;

	}

	/* 解密函数
	 *
	 * keybyte为加密密钥，长度为24字节
	 *
	 * src为加密后的缓冲区
	 *
	 * exp:
	 * ...
	 * byte[] srcBytes = decryptMode(keyBytes,encoded);
	 * System.out.println("解密后的字符串:" + (new String(srcBytes)));
	 *
	 */

	public static byte[] decryptMode(byte[] keybyte,byte[] src){

		try {

			//生成密钥

			SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

			//解密

			Cipher c1 = Cipher.getInstance(Algorithm);

			c1.init(Cipher.DECRYPT_MODE, deskey);

			return c1.doFinal(src);

		} catch (java.security.NoSuchAlgorithmException e1) {

			// TODO: handle exception

			e1.printStackTrace();

			}catch(javax.crypto.NoSuchPaddingException e2){

				e2.printStackTrace();

				}catch(Exception e3){

					e3.printStackTrace();

		}

		return null;
	}


	/*
	 * 将32位byte转为16进制字符
	 *
	 * @param b
	 *            源数组
	 */

	public static String byte2Hex(byte[] b){

		String hs="";

		String stmp="";

		for(int n=0; n<b.length; n++){

			stmp = (Integer.toHexString(b[n]& 0XFF));
			
			if(stmp.length()==1){
			
				hs = hs + "0" + stmp;
			
			}else{
			
				hs = hs + stmp;
			
			}
			
			//if(n<b.length-1)hs=hs+":";
		
		}
		
		return hs.toUpperCase();
	
	}
}
